package com.version1.diabeco.ui.ajustes.perfilusuario;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

import kankan.wheel.widget.OnWheelChangedListener;
import kankan.wheel.widget.WheelView;
import kankan.wheel.widget.adapters.WheelViewAdapter;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import com.version1.diabeco.ActivityMain;
import com.version1.diabeco.DateArrayAdapter;
import com.version1.diabeco.DateNumericAdapter;
import com.version1.diabeco.R;
import com.version1.diabeco.data.ajustes.perfilusuario.PerfilUsuarioDaoImpl;
import com.version1.diabeco.model.ajustes.perfilusuario.PerfilUsuario;
import com.version1.diabeco.ui.peso.ActivityRegistroPeso;


public class ActivityPerfilUsuario extends Activity {
	EditText editTextApodo, editTextNombre, editTextApellido, editTextEmail, 
			 editTextUmbralBajo, editTextUmbralAlto, editTextPeso, editTextAltura;
	Spinner spinnerSexo, spinnerTipoDiabetes;
	Button btnFechaNacimiento;
	Calendar objCalendario;
	Intent intentPerfilUsuario;
	PerfilUsuario objPerfilUsuario;
	public static final float ALTURA_MIN_MTS = 0.4F;
	public static final float ALTURA_MAX_MTS = 2.3F;
	public static final float ALTURA_MIN_PIES = 1F;
	public static final float ALTURA_MAX_PIES = 8F;
	public static final float PESO_MIN_KGS = 10F;
	public static final float PESO_MAX_KGS = 300F;
	public static final float PESO_MIN_LBS = 22F;
	public static final float PESO_MAX_LBS = 660F;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_perfil_usuario);
		
		// Elementos de la Pantalla
		editTextApodo	    = (EditText) findViewById(R.id.editTextApodo);
		editTextNombre	    = (EditText) findViewById(R.id.editTextNombre);
		editTextApellido    = (EditText) findViewById(R.id.editTextApellido);
		editTextEmail       = (EditText) findViewById(R.id.editTextEmail);
		spinnerSexo			= (Spinner) findViewById(R.id.spinnerSexo);
		btnFechaNacimiento  = (Button) findViewById(R.id.btnFechaNacimiento);
		spinnerTipoDiabetes = (Spinner) findViewById(R.id.spinnerTipoDiabetes);
		editTextUmbralBajo  = (EditText) findViewById(R.id.editTextUmbralBajo);
		editTextUmbralAlto  = (EditText) findViewById(R.id.editTextUmbralAlto);
		editTextPeso        = (EditText) findViewById(R.id.editTextPeso);
		editTextAltura      = (EditText) findViewById(R.id.editTextAltura);

		objCalendario = Calendar.getInstance();		
		
		this.inicializarPantallaPerfilUsuario();
		
		editTextApodo.addTextChangedListener(new TextWatcher(){
	        public void afterTextChanged(Editable s) {

	        }
	        public void beforeTextChanged(CharSequence s, int start, int count, int after){
	        	
	        }
	        public void onTextChanged(CharSequence s, int start, int before, int count){

	        }
	    }); 
		
		
		editTextUmbralBajo.addTextChangedListener(new TextWatcher(){
	        public void afterTextChanged(Editable s) {

	        }
	        public void beforeTextChanged(CharSequence s, int start, int count, int after){
	        	
	        }
	        public void onTextChanged(CharSequence s, int start, int before, int count){

	        }
	    }); 
		
		editTextUmbralAlto.addTextChangedListener(new TextWatcher(){
	        public void afterTextChanged(Editable s) {
	        	String strValor;
	    		float umbralBajo=0F, umbralAlto=0F;
	    		Resources res = getResources();
	    		
	        	if (editTextUmbralBajo.getText().toString().isEmpty() != true &&
	        		editTextUmbralAlto.getText().toString().isEmpty() != true) {
	        	
		        	strValor = editTextUmbralBajo.getText().toString();
		    		if (!strValor.isEmpty()) {
		    			umbralBajo = Float.valueOf(strValor);
		      		}		
		        	
		    		strValor = editTextUmbralAlto.getText().toString();
		    		if (!strValor.isEmpty()) {
		    			umbralAlto = Float.valueOf(strValor);
		      		}
		    		
		    		if (umbralBajo > umbralAlto) {
		    			editTextUmbralBajo.setError(res.getString(R.string.msg_umbrales));
		    		}else {
		    		  editTextUmbralBajo.setError(null);
		    		}
	        	}
	        }
	        
	        public void beforeTextChanged(CharSequence s, int start, int count, int after){

	        }
	        
	        public void onTextChanged(CharSequence s, int start, int before, int count){

	        }
	    });		
		
		
		editTextPeso.addTextChangedListener(new TextWatcher(){
	        public void afterTextChanged(Editable s) {
	        	Resources res = getResources();
	    		String strPeso = editTextPeso.getText().toString();
	    		Float floatPeso = 0F;
	    		try {
	    			floatPeso = Float.valueOf(strPeso);
	    			}
	    			catch (NumberFormatException e)
	    			{
	    				editTextPeso.setError(res.getString(R.string.msg_solo_numeros));
	    			}
	    		if (objPerfilUsuario.getUmPeso().equals(ActivityMain.UM_KGS)) {
	    			if (floatPeso>=PESO_MIN_KGS && floatPeso<=PESO_MAX_KGS) {
	    				editTextPeso.setError(null);
//	    			} else {
//	    				editTextPeso.setError(res.getString(R.string.msg_rango_peso_kgs));
	    			}
	    		} else {
	    			if (floatPeso>=PESO_MIN_LBS && floatPeso<=PESO_MAX_LBS) {
	    				editTextPeso.setError(null);
//	    			} else {
//	    				editTextPeso.setError(res.getString(R.string.msg_rango_peso_kgs));	    				
	    			}
	    		}
	        }
	        public void beforeTextChanged(CharSequence s, int start, int count, int after){
	        	
	        }
	        public void onTextChanged(CharSequence s, int start, int before, int count){

	        }
	    }); 

		editTextAltura.addTextChangedListener(new TextWatcher(){
	        public void afterTextChanged(Editable s) {
	        	String strAltura = editTextAltura.getText().toString();
	    		Float floatAltura = 0F;
	        	Resources res = getResources();
	    		
	    		try {
	    			floatAltura = Float.valueOf(strAltura);
	    			}
	    			catch (NumberFormatException e)
	    			{
	    				editTextAltura.setError(res.getString(R.string.msg_solo_numeros));
	    			}
	    		if (objPerfilUsuario.getUmAltura().equals(ActivityMain.UM_MTS)) {
	    			if (floatAltura>=ALTURA_MIN_MTS && floatAltura<=ALTURA_MAX_MTS) {
	    				editTextAltura.setError(null);
	    			}
	    		} else {
	    			if (floatAltura>=ALTURA_MIN_PIES && floatAltura<=ALTURA_MAX_PIES) {
	    				editTextAltura.setError(null);
	    			}
	    		}
	        }
	        public void beforeTextChanged(CharSequence s, int start, int count, int after){
	        	
	        }
	        public void onTextChanged(CharSequence s, int start, int before, int count){

	        }
	    }); 		
	}

	
	@Override
	public void onBackPressed() {
		if (ValidarPantalla() == 0) {
			super.onBackPressed(); // allows standard use of backbutton for page 1
		}
	}

	
	@Override
	protected void onPause() {
		super.onPause();
		
		if (ValidarPantalla() == 0) {
			guardarPerfilusuario();	
		}
	}
	
	
	private int ValidarPantalla() {
    	String textErrorString;
    	CharSequence textErrorChar;
    	int banderaError = 0;
    	Resources res = getResources();
    	
    	//Apodo
    	textErrorString = editTextApodo.getText().toString();
    	textErrorChar = editTextApodo.getError();
    	if (textErrorString.length() == 0 ||
    		textErrorChar            != null	) {
        		banderaError = 1;
        		editTextApodo.setError(res.getString(R.string.msg_apodo));
		}

    	
    	//Umbral Bajo
    	textErrorString = editTextUmbralBajo.getText().toString();
    	textErrorChar = editTextUmbralBajo.getError();
    	Float floatUmbralBajo = 0F;
    	if (textErrorString.length() == 0 ||
    		textErrorChar            != null	) {
        		banderaError = 1;
        		editTextUmbralBajo.setError(res.getString(R.string.msg_umbral_bajo));
    	}else {
    		try {
    			floatUmbralBajo = Float.valueOf(textErrorString);
    			}
    			catch (NumberFormatException e)
    			{
    				banderaError = 1;
    				editTextUmbralBajo.setError(res.getString(R.string.msg_solo_numeros));
    		}
    	}
    	
   	
    	//Umbral Alto
    	textErrorString = editTextUmbralAlto.getText().toString();
    	textErrorChar = editTextUmbralAlto.getError();
    	Float floatUmbralAlto = 0F;
    	if (textErrorString.length() == 0 ||
    		textErrorChar            != null	) {
        		banderaError = 1;
        		editTextUmbralAlto.setError(res.getString(R.string.msg_umbral_alto));
    	}else {
    		try {
    			floatUmbralAlto = Float.valueOf(textErrorString);
    			}
    			catch (NumberFormatException e)
    			{
    				banderaError = 1;
    				editTextUmbralAlto.setError(res.getString(R.string.msg_solo_numeros));
    		}
		}  

		if (floatUmbralBajo > floatUmbralAlto) {
			banderaError = 1;
			editTextUmbralBajo.setError(res.getString(R.string.msg_umbrales));
		}	
		
    	//Altura
		String strAltura = editTextAltura.getText().toString();
		Float floatAltura = 0F;
		try {
			floatAltura = Float.valueOf(strAltura);
			}
			catch (NumberFormatException e)
			{
				banderaError = 1;
				editTextAltura.setError(res.getString(R.string.msg_solo_numeros));
			}
		if (objPerfilUsuario.getUmAltura().equals(ActivityMain.UM_MTS)) {
			if (!(floatAltura>=ALTURA_MIN_MTS && floatAltura<=ALTURA_MAX_MTS)) {
				banderaError = 1;
				editTextAltura.setError(res.getString(R.string.msg_rango_altura_mts));
			}
		} else {
			if (!(floatAltura>=ALTURA_MIN_PIES && floatAltura<=ALTURA_MAX_PIES)) {
				banderaError = 1;
				editTextAltura.setError(res.getString(R.string.msg_rango_altura_pies));
			}
		}

    	//Peso
		String strPeso = editTextPeso.getText().toString();
		Float floatPeso = 0F;
		try {
			floatPeso = Float.valueOf(strPeso);
			}
			catch (NumberFormatException e)
			{
				banderaError = 1;
				editTextPeso.setError(res.getString(R.string.msg_solo_numeros));
			}
		if (objPerfilUsuario.getUmPeso().equals(ActivityMain.UM_KGS)) {
			if (!(floatPeso>=PESO_MIN_KGS && floatPeso<=PESO_MAX_KGS)) {
				banderaError = 1;
				editTextPeso.setError(res.getString(R.string.msg_rango_peso_kgs));
			}
		} else {
			if (!(floatPeso>=PESO_MIN_LBS && floatPeso<=PESO_MAX_LBS)) {
				banderaError = 1;
				editTextPeso.setError(res.getString(R.string.msg_rango_peso_lbs));
			}
		}
		
		return banderaError;
	}


	private void inicializarPantallaPerfilUsuario() {
		
		objPerfilUsuario = PerfilUsuarioDaoImpl.getInstance(this).selectUsuarioActivo();

		if (objPerfilUsuario != null ) {
			if (objPerfilUsuario.getId() != null) {
				editTextApodo.setText(objPerfilUsuario.getId());
				editTextApodo.setEnabled(false);
				editTextApodo.setFocusable(false);
			}
			
			editTextNombre.setText(objPerfilUsuario.getNombre());
			editTextApellido.setText(objPerfilUsuario.getApellido());
			editTextEmail.setText(objPerfilUsuario.getEmail());
			editTextUmbralBajo.setText(objPerfilUsuario.getUmbralBajo().toString());
			editTextUmbralAlto.setText(objPerfilUsuario.getUmbralAlto().toString());
			editTextPeso.setText(objPerfilUsuario.getPeso().toString());
			editTextAltura.setText(objPerfilUsuario.getAltura().toString());
			btnFechaNacimiento.setText(ActivityMain.DATE_FORMAT.format(new Date(objPerfilUsuario.getFechaNacimiento())));
			
	       	//Posicionamos los spinner
			posicionarSpinner(objPerfilUsuario.getSexo(), spinnerSexo);
			posicionarSpinner(objPerfilUsuario.getTipoDiabetes(), spinnerTipoDiabetes);
		}	
	}




	
	private void guardarPerfilusuario() {
		Date dia = null;
		Long fechaNacimiento = 0L;
		String strValor;
		objPerfilUsuario = new PerfilUsuario();
		
		//Alias (Id)
		String id = editTextApodo.getText().toString();
		objPerfilUsuario.setId(id);
		
		//Nombre
		String nombre = editTextNombre.getText().toString();
		objPerfilUsuario.setNombre(nombre);

		//Apellido
		String apellido = editTextApellido.getText().toString();
		objPerfilUsuario.setApellido(apellido);

		//Email
		String email = editTextEmail.getText().toString();
		objPerfilUsuario.setEmail(email);
		
		//Sexo
		String sexo = spinnerSexo.getSelectedItem().toString();
		objPerfilUsuario.setSexo(sexo);
				
		//Fecha de Nacimiento
		String strDia = (String) btnFechaNacimiento.getText();
		try {
			if (!strDia.isEmpty()) {
				dia = ActivityMain.DATE_FORMAT.parse(strDia);
				fechaNacimiento = dia.getTime();
			}
		} catch (ParseException e) {
			throw new RuntimeException(e);
		}
		objPerfilUsuario.setFechaNacimiento(fechaNacimiento);

		//Tipo de Diabetes
		String tipoDiabetes = spinnerTipoDiabetes.getSelectedItem().toString();
		objPerfilUsuario.setTipoDiabetes(tipoDiabetes);
		 
		//Umral Bajo
		strValor = editTextUmbralBajo.getText().toString();
		if (!strValor.isEmpty()) {
			float umbralBajo = Float.valueOf(strValor);
			objPerfilUsuario.setUmbralBajo(umbralBajo);
		}

		//Umral Alto
		strValor = editTextUmbralAlto.getText().toString();
		if (!strValor.isEmpty()) {
			float umbralAlto = Float.valueOf(strValor);
			objPerfilUsuario.setUmbralAlto(umbralAlto);			
		}

		//Peso
		strValor = editTextPeso.getText().toString();
		if (!strValor.isEmpty()) {
			float peso = Float.valueOf(strValor);
			objPerfilUsuario.setPeso(peso);
		}

		//Altura
		strValor = editTextAltura.getText().toString();
		if (!strValor.isEmpty()) {
			float altura = Float.valueOf(strValor);
			objPerfilUsuario.setAltura(altura);
		}

		//Grabamos como usuario activo
		PerfilUsuarioDaoImpl.getInstance(this).save(objPerfilUsuario, 1);

		// Salimos
		Toast.makeText(this, "Perfil de Usuario Guardado", Toast.LENGTH_SHORT).show();
		this.finish();
	}


	/** Se llama al hacer click en el Boton "Fecha Nacimiento" */
	public void ClickFechaNacimiento(View v) {
		LayoutInflater inf = LayoutInflater.from(this);

		// layout of alert box contains
		View view = inf.inflate(R.layout.wheeldate, null);

		final WheelView month = (WheelView) view.findViewById(R.id.month);
		final WheelView year = (WheelView) view.findViewById(R.id.year);
		final WheelView day = (WheelView) view.findViewById(R.id.day);

		OnWheelChangedListener listener = new OnWheelChangedListener() {
			public void onChanged(WheelView wheel, int oldValue, int newValue) {
				updateDays(year, month, day);
			}
		};

		// month
		int curMonth = objCalendario.get(Calendar.MONTH);
		String months[] = new String[] { "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto",
				"Septiembre", "Octubre", "Noviembre", "Deciembre" };
		month.setViewAdapter(new DateArrayAdapter(this, months, curMonth));
		// month.setCyclic(true);
		month.setCurrentItem(0);
		month.addChangingListener(listener);

		// year
		final int curYear = objCalendario.get(Calendar.YEAR);
		WheelViewAdapter adapter;
		adapter = new DateNumericAdapter(this, curYear - 70, curYear, curYear);
		year.setViewAdapter(adapter);
		year.setCurrentItem((curYear - (curYear - 70)) - 10);
		year.addChangingListener(listener);

		// //day
		updateDays(year, month, day);
		day.setCurrentItem(0);

		new AlertDialog.Builder(this).setMessage(R.string.titulo_dialogo_fecha).setView(view)
				.setPositiveButton(R.string.btn_fijar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {

						int dia = day.getCurrentItem() + 1;
						int mes = month.getCurrentItem() + 1;
						int ano = (curYear - 70) + year.getCurrentItem();

						btnFechaNacimiento.setText(new StringBuilder().append(dia).append("/").append(mes).append("/")
										  .append(ano).append(" "));
					}
				})

				.setNegativeButton(R.string.btn_cancelar, new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						return;
					}
				}).create().show();

	}

	/**
	 * Updates day wheel. Sets max days according to selected month and year
	 */
	void updateDays(WheelView year, WheelView month, WheelView day) {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + year.getCurrentItem());
		calendar.set(Calendar.MONTH, month.getCurrentItem());

		int maxDays = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		day.setViewAdapter(new DateNumericAdapter(this, 1, maxDays, calendar.get(Calendar.DAY_OF_MONTH) - 1));
		int curDay = Math.min(maxDays, day.getCurrentItem() + 1);
		day.setCurrentItem(curDay - 1, true);
	}	
	
	
	void posicionarSpinner(String texto, Spinner combo) {

		if (texto != null) {
			ArrayAdapter myAdap = (ArrayAdapter) combo.getAdapter();
			int spinnerPosition = myAdap.getPosition(texto);
			combo.setSelection(spinnerPosition);
		}
	}	
	
}
